package com.roamer.rest;

import com.roamer.rest.ResultCode.ErrorCode;
import lombok.ToString;

/**
 * API 错误响应代码接口
 * <ul>
 * <li>3** ： 重定向，需要进一步的操作以完成请求</li>
 * <li>4** ：客户端错误，请求包含语法错误或无法完成请求</li>
 * <li>5** ：服务器错误，服务器在处理请求的过程中发生了错误</li>
 * </ul>
 *
 * @author roamer
 * @version V1.0
 * @date 2019/07/17 11:14
 */
@ToString
public enum IErrorCode implements ErrorCode {

    /**
     * Bad Request - [*]：无效的请求
     */
    C40000(40000, "参数无效"),
    C40001(40001, "缺少参数"),
    C40002(40002, "参数解析失败"),
    C40003(40003, "参数绑定失败"),
    C40004(40004, "参数验证未通过"),

    /**
     * Unauthorized - [*]：未认证（令牌、用户名、密码错误）。
     */
    C40100(40100, "认证无效"),

    /**
     * Forbidden - [*]：权限不足（如越权访问）。
     */
    C40300(40300, "权限不足"),

    /**
     * Not Found - [*]：发出的请求针对的是不存在的记录，服务器没有进行操作，该操作是幂等的。
     */
    C40400(40400, "资源未找到"),

    /**
     * Method Not Allowed - [*]：HTTP请求方法不被服务器允许。
     */
    C40500(40500, "不支持的请求方法"),

    /**
     * Not Acceptable - [GET]：请求的格式不可得（不支持请求首部 Accept 指定的数据格式）
     */
    C40600(40600, "不支持的请求资源格式"),

    /**
     * Conflict - [*]：资源冲突（如用户通过手机号注册，而该手机号已经存在）。
     */
    C40900(40900, "资源冲突"),

    /**
     * Gone -[GET]：请求的资源被永久删除，且不会再得到的。
     */
    C41000(41000, "资源不存在"),

    /**
     * Unsupported Media Type -[*]：不支持请求首部 Content-Type 指定的数据格式
     */
    C41500(41500, "不支持的请求参数格式"),

    /**
     * Locked -[*]：当前资源被锁定
     */
    C42300(42300, "资源被锁定"),

    /**
     * Too Many Requests - [*] 请求过多被限制。
     */
    C42900(42900, "请求过于频繁"),

    /**
     * Internal Server Error - [*]：服务器发生错误，无法判断发出的请求是否成功。
     */
    ERROR(50000, "系统内部错误"),

    /**
     * Not Implemented - [*]：接口未实现。
     */
    C50100(50100, "功能暂未实现"),

    /**
     * Service Unavailable - [*]：服务器暂时处理不可用状态，服务器需要维护或第三方 API 请求超时/不可达。
     */
    C50300(50300, "系统维护中"),
    C50301(50301, "内部系统请求异常"),
    C50302(50302, "外部系统请求异常"),
    ;


    /** 状态码 */
    private final int code;

    /** 提示信息 */
    private final String message;

    IErrorCode(int code, String message) {
        this.code = code;
        this.message = message;
    }

    @Override
    public int getCode() {
        return code;
    }

    @Override
    public String getMessage() {
        return message;
    }

}
